package com.david.webtest

import android.app.Activity
import android.os.Bundle
import android.view.View
import android.webkit.JsPromptResult
import android.webkit.JsResult
import android.webkit.WebChromeClient
import android.webkit.WebResourceRequest
import android.webkit.WebResourceResponse
import android.webkit.WebView
import android.webkit.WebViewClient
import com.david.core.imgloader.LruImageLoader
import java.io.ByteArrayInputStream
import java.io.InputStream

/***
 * html 向native传递数据
 * 1：自定义scheme方式，在native拦截url判断是否应该处理；
 * 2：通过html调用alert、confirm、prompt方法，native拦截方法并重新逻辑
 * 3：通过定义jsBrige方式（android），JS注入对象（iOS），html调用相关方法
 *
 * native向html传递数据：
 * 1：html中定义js方法，native通过注入js调用方法传递
 */
class WebActivity : Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_david_web)
        LruImageLoader.getInstance().init(application)
        val mWebView = findViewById<View>(R.id.webview) as WebView
        val webSettings = mWebView.settings
        webSettings.javaScriptEnabled = true
        //        webSettings.setWebChromeClient(webChromeClient);
        //        webSettings.setWebViewClient(webViewClient);
        mWebView.webChromeClient = object : WebChromeClient() {
            override fun onJsAlert(view: WebView, url: String, message: String, result: JsResult): Boolean {
                return super.onJsAlert(view, url, message, result)
            }

            override fun onJsConfirm(view: WebView, url: String, message: String, result: JsResult): Boolean {
                return super.onJsConfirm(view, url, message, result)
            }

            override fun onJsPrompt(view: WebView, url: String, message: String, defaultValue: String, result: JsPromptResult): Boolean {
                return super.onJsPrompt(view, url, message, defaultValue, result)
            }
        }
        mWebView.webViewClient = object : WebViewClient() {
            override fun shouldInterceptRequest(webView: WebView, request: WebResourceRequest): WebResourceResponse? {
                val url = request.url.toString()
                request.url.getQueryParameter("")
                //                try {
                if (url.contains(".png") || url.endsWith(".jpg") || url.endsWith(".jpeg") || url.endsWith(".webp") || url.endsWith(".NEF")) {
                    //                        @SuppressLint("ResourceType") InputStream is = getResources().openRawResource(R.mipmap.ic_logo);
                    val `is`: InputStream? = null
                    try {
                        //                            if (LruImageLoaderUtils.isImgCached(url)) {
                        //                                is = LruImageLoaderUtils.getImgCacheStream(url);
                        //                                WebResourceResponse response = new WebResourceResponse("image/png",
                        //                                        "utf-8", is);
                        //                                Log.e("img", "imgUrl is:" + url);
                        //
                        //                                return response;
                        //                            } else {
                        //                                LruImageLoader.getInstance().loadCacheImage(url, null);
                        //                            }
                    } catch (e: Exception) {
                        e.printStackTrace()
                    }
                }
                //                    else if (url.endsWith("jquery.min.js")) {
                //                        InputStream is = appRm.getInputStream(R.raw.jquery_min_js);
                //                        WebResourceResponse response = new WebResourceResponse("text/javascript",
                //                                "utf-8", is);
                //                        return response;
                //                    }
                //                } catch (IOException e) {
                //                    e.printStackTrace();
                //                }
                return super.shouldInterceptRequest(webView, request)

                /*
    Android WebView 本身并不支持直接与 Glide 这样的图片加载库进行交互。WebView 用于加载和展示网页，而 Glide 是专门用于在 Android ImageView 中加载和缓存图片的库。

然而，你可以通过自定义 WebViewClient 并重写 shouldInterceptRequest 方法来达到代理加载图片的效果。在这个方法中，你可以判断请求的 URL 是否是图片，如果是，就使用 Glide 加载，然后将结果转为 WebResourceResponse 返回。

这种方式是有局限性的，因为它需要在后台线程中进行同步的图片加载，而 Glide 本身是为异步加载设计的。如果图片较大或网络状况不好，可能会导致阻塞，影响 WebView 的渲染性能。

以下是一个简单示例：

webView.setWebViewClient(new WebViewClient() {
    @Nullable
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        String url = request.getUrl().toString();
        if (url.endsWith(".jpg") || url.endsWith(".png")) { // 判断是否图片资源
            try {
                FutureTarget<Bitmap> futureTarget = Glide.with(getApplicationContext())
                        .asBitmap()
                        .load(url)
                        .submit();
                Bitmap bitmap = futureTarget.get(); // 同步加载
                ByteArrayOutputStream out = new ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
                ByteArrayInputStream inputStream = new ByteArrayInputStream(out.toByteArray());
                return new WebResourceResponse("image/png", "UTF-8", inputStream);
            } catch (ExecutionException | InterruptedException e) {
                e.printStackTrace();
            }
        }
        return super.shouldInterceptRequest(view, request);
    }
});
以上代码会将 WebView 加载的图片请求拦截下来，然后使用 Glide 加载图片，并将结果转为 WebResourceResponse 返回给 WebView。

此外，为了使 Glide 能在后台线程中同步加载图片，还需要在 Glide 的配置中开启这个选项：

Glide.get(this).setAllowedOverMainThread(false);
注意: 这种方法的性能可能并不理想，如果图片较大或网络状况不好，可能会导致阻塞，影响 WebView 的渲染性能。在实际项目中使用时需要做好性能优化和异常处理。同时，这种方式可能违反了 WebView 和 Glide 的设计初衷，也可能会带来一些不可预期的问题。*/
            }
        }
        mWebView.loadUrl("https://juejin.cn/post/7070849501166059551")
    }

    private fun getWebResourceResponse(url: String, mime: String, style: String): WebResourceResponse? {
        //        try {
        //            response = new WebResourceResponse(mime, "UTF-8", new FileInputStream(new File(getJSPath() + TPMD5.md5String(url) + style)));
        //        } catch (FileNotFoundException e) {
        //            e.printStackTrace();
        //        }
        return null as WebResourceResponse?
    }

    override fun onBackPressed() {
        super.onBackPressed()
    }
}
